//递归
#include <iostream>
#include <cstring>


//自己调用自己
void func(int count)
{
    //递归类似for循环，可以更直观，提高代码复用，但是要防止死循环
    //递归的终止条件
    if(count == 0)
        return;
    //递归的主体
    count--;
    printf("第%d次调用\n",count);
    func(count);
}

//有一只猴子，n个桃子，每天吃剩下的桃子的一半多一个 10天后剩1个 
int MonkeyPeach(int day)//倒推
{
    if(day == 10)
        return 1;
    return (MonkeyPeach(day + 1) + 1) * 2;
}

//递归计算字符串长度
int Strlen(char *s)
{
    if(*s == '\0')
        return 0;//到\0返回
    return Strlen(s + 1) + 1;
}

//递归求n!
int fatorial(int n)
{
    if(n == 1 || n == 0)//0会出现无限阶乘
        return 1;
    return n * fatorial(n - 1);
}

//青蛙跳台阶
//一个青蛙一次跳一个台阶或一次跳两个台阶  求n级台阶有多少种跳法
//第n级台阶 等于 跳n-1级+跳n-2级
//既是递归，又是Fibonacci数列，又是动态规划
int Step(int n)
{
    if(n == 1)
        return 1;
    if(n == 2)
        return 2;
    return Step(n - 1) + Step(n - 2);//符合Fibonacci数列
}

int main()
{
    printf("第1天:%d\n",MonkeyPeach(1));
    printf("%d\n",Strlen("hello"));
    printf("%d\n",fatorial(5));
    printf("%d\n",Step(4));


    int a = 10;
    int b = 20;
    int mid = (a>>1) + (b>>1);//右移就是除以二，位运算,但是是整除可能会少1
    int mid = (a & b) + ((a ^ b)>> 1);//求平均数，&相同位上的值取平均数，^不同位上数据取出相加,>>除以2，这个结果不会少1
    std::cout<<mid<<std::endl;
    return 0;
}